package com.zzyl.framework.config;

import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;

public class TimeSlotUtils {
    
    private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    
    /**
     * 生成工作时间段内的半小时间隔时间点（包含结束时间）
     * 默认工作时间: 08:00:00 - 18:00:00
     * 默认间隔: 30分钟
     * 
     * @param startTime 开始时间 (如: 2025-10-16T00:00)
     * @param endTime 结束时间 (如: 2025-10-17T00:00)
     * @return 时间点集合，格式: "2025-10-16 08:00:00"
     */
    public static List<String> generateWorkTimeSlots(LocalDateTime startTime, LocalDateTime endTime) {
        return generateWorkTimeSlots(startTime, endTime, "08:00:00", "18:00:00", 30);
    }
    
    /**
     * 生成工作时间段内的半小时间隔时间点（包含结束时间）
     * 
     * @param startTime 开始时间 (如: 2025-10-16T00:00)
     * @param endTime 结束时间 (如: 2025-10-17T00:00)
     * @param workStart 工作开始时间 (格式: "08:00:00")
     * @param workEnd 工作结束时间 (格式: "18:00:00")
     * @param intervalMinutes 时间间隔(分钟)
     * @return 时间点集合，格式: "2025-10-16 08:00:00"
     */
    public static List<String> generateWorkTimeSlots(LocalDateTime startTime, LocalDateTime endTime,
                                                    String workStart, String workEnd, 
                                                    int intervalMinutes) {
        List<String> timeSlots = new ArrayList<>();
        
        LocalTime workStartTime = LocalTime.parse(workStart);
        LocalTime workEndTime = LocalTime.parse(workEnd);
        
        // 遍历每一天
        LocalDateTime currentDay = startTime;
        while (currentDay.isBefore(endTime)) {
            // 设置当天的工作开始时间
            LocalDateTime currentSlot = LocalDateTime.of(currentDay.toLocalDate(), workStartTime);
            
            // 生成当天的工作时间段（包含结束时间）
            while (!currentSlot.toLocalTime().isAfter(workEndTime) && 
                   currentSlot.isBefore(endTime)) {
                timeSlots.add(currentSlot.format(DATE_TIME_FORMATTER));
                currentSlot = currentSlot.plusMinutes(intervalMinutes);
            }
            
            // 移动到下一天
            currentDay = currentDay.plusDays(1);
        }
        
        return timeSlots;
    }
    
    /**
     * 生成工作时间段内的半小时间隔时间点（包含结束时间）- 返回LocalDateTime列表
     */
    public static List<LocalDateTime> generateWorkTimeSlotsAsLocalDateTime(LocalDateTime startTime, LocalDateTime endTime) {
        return generateWorkTimeSlotsAsLocalDateTime(startTime, endTime, "08:00:00", "18:00:00", 30);
    }
    
    /**
     * 生成工作时间段内的半小时间隔时间点（包含结束时间）- 返回LocalDateTime列表
     */
    public static List<LocalDateTime> generateWorkTimeSlotsAsLocalDateTime(LocalDateTime startTime, LocalDateTime endTime,
                                                                          String workStart, String workEnd, 
                                                                          int intervalMinutes) {
        List<LocalDateTime> timeSlots = new ArrayList<>();
        
        LocalTime workStartTime = LocalTime.parse(workStart);
        LocalTime workEndTime = LocalTime.parse(workEnd);
        
        // 遍历每一天
        LocalDateTime currentDay = startTime;
        while (currentDay.isBefore(endTime)) {
            // 设置当天的工作开始时间
            LocalDateTime currentSlot = LocalDateTime.of(currentDay.toLocalDate(), workStartTime);
            
            // 生成当天的工作时间段（包含结束时间）
            while (!currentSlot.toLocalTime().isAfter(workEndTime) && 
                   currentSlot.isBefore(endTime)) {
                timeSlots.add(currentSlot);
                currentSlot = currentSlot.plusMinutes(intervalMinutes);
            }
            
            // 移动到下一天
            currentDay = currentDay.plusDays(1);
        }
        
        return timeSlots;
    }
}